package pkg1;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

import java.io.IOException;
import java.io.StringReader;
import java.nio.file.Paths;


/**
 * <pre>
 *  Lucene全局搜索服务类
 * </pre>
 *
 * @author nicky
 * @version 1.00.00
 *
 * <pre>
 * 修改记录
 *    修改后版本:     修改人：  修改日期:2018年04月18日     修改内容:
 *          </pre>
 */
public class SearchBuilder {

    public static void doSearch(String indexDir, String queryStr) throws IOException, ParseException, InvalidTokenOffsetsException {
        // 索引目录对象
        Directory directory = FSDirectory.open(Paths.get(indexDir));
        // 索引读取工具
        IndexReader reader = DirectoryReader.open(directory);
        // 索引搜索工具
        IndexSearcher searcher = new IndexSearcher(reader);
        Analyzer analyzer = new SmartChineseAnalyzer();
        // 创建查询解析器,两个参数：默认要查询的字段的名称，分词器
        QueryParser parser = new QueryParser("tcontent", analyzer);
        // 创建查询对象
        Query query = parser.parse(queryStr);

        long startTime = System.currentTimeMillis();
        // 搜索数据,两个参数：查询条件对象要查询的最大结果条数
        // 返回的结果是 按照匹配度排名得分前N名的文档信息（包含查询到的总条数信息、所有符合条件的文档的编号信息）。
        TopDocs docs = searcher.search(query, 10);

        System.out.println("查找" + queryStr + "所用时间：" + (System.currentTimeMillis() - startTime));
        // 获取总条数
        System.out.println("查询到" + docs.totalHits + "条记录");
        //加入高亮显示的
        SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<b><font color=red>", "</font></b>");
        QueryScorer scorer = new QueryScorer(query);//计算查询结果最高的得分
        Fragmenter fragmenter = new SimpleSpanFragmenter(scorer);//根据得分算出一个片段
        Highlighter highlighter = new Highlighter(simpleHTMLFormatter, scorer);
        highlighter.setTextFragmenter(fragmenter);//设置显示高亮的片段

        System.out.println("++++++++++++++++++++++++++++++");
        // 获取得分文档对象（ScoreDoc）数组.SocreDoc中包含：文档的编号、文档的得分
        for (ScoreDoc scoreDoc : docs.scoreDocs) {
            // 取出文档编号
            int docID = scoreDoc.doc;
            // 根据编号去找文档
            Document doc = searcher.doc(docID);

            String ids = doc.get("id");
            String tcontent = doc.get("tcontent");
            String titles = doc.get("title");

            System.out.println(ids);
            System.out.println(tcontent);
            System.out.println(titles);


            if (tcontent != null) {
                TokenStream tokenStream = analyzer.tokenStream("tcontent", new StringReader(tcontent));
                String summary = highlighter.getBestFragment(tokenStream, tcontent);
                System.out.println(summary);
            }
            // 取出文档得分
            System.out.println("得分： " + scoreDoc.score);
            System.out.println("------------------------------------------");
        }
        reader.close();
    }

    public static void main(String[] args) {
        String indexDir = "D:\\data\\lucene";
        String q = "陈培根"; //查询这个字符串
        try {
            doSearch(indexDir, q);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}




